#ifndef _I2C_H
#define _I2C_H

#include "common.h"	


/* 
 *IC2状态码，方便通过返回值对程序返回处进行定位
 */
#define I2C_OK				     (0)
#define I2C_ERROR                (1)
#define I2C_BUSY				 (2)
#define I2C_IDLE				 (3)
#define I2C_NAK				     (4)
#define I2C_ARBITRATIONLOST	     (5)
#define I2C_TIMEOUT			     (6)
#define I2C_ADDRNAK			     (7)



typedef enum enI2C_OPCODE
{
    I2C_WRITE = 0,            /* 主机向从机写数据 */
    I2C_READ  = 1,  		/* 主机从从机读数据 */
    I2C_DONOTHING_BULL
} I2C_OPCODE;

/*
 * 主机传输结构体
 */
 #if  0
typedef struct tagI2cTransfer
{
    uint8_t  ucSlaveAddress;      	     /* 7位从机地址 */
    uint32_t ulOpcode  ; 		     /* 操作码*/
    uint32_t ulSubAddress;       		/* 目标寄存器地址 */
    uint8_t  ulSubAddressLen;    	     /* 寄存器地址长度 */
    volatile uint32_t ulLenth;  	     /* 数据长度 */
    uint8_t *volatile pbuf;    	     /* 数据*/
} I2C_TRANSFER;
#else
typedef struct tagI2cTransfer
{
    uint8_t   ucSlaveAddress;      	     /* 7位从机地址 */
    uint32_t  ulOpcode  ; 		     /* 操作码*/
    uint8_t  *volatile ulSubAddress;       		/* 目标寄存器地址 */
    uint8_t  ulSubAddressLen;    	     /* 寄存器地址长度 */
    volatile uint32_t ulLenth;  	     /* 数据长度 */
    uint8_t *volatile pbuf;    	     /* 数据*/
} I2C_TRANSFER;


#endif

/**********************************************************************
 * 函数名称： i2c_init
 * 功能描述： 初始化i2c
 * 输入参数： 1.I2C的基地址
 * 返 回 值： 无
 ***********************************************************************/
void i2c_init(I2C_Type *IIC_BASE);

/**********************************************************************
 * 函数名称： i2c_check
 * 功能描述： 检查并清除错误
 * 输入参数： 1.I2C的基地址 2.传输结构体
 * 返 回 值： 返回0成功，返回<0失败
 ***********************************************************************/

int8_t i2c_check(I2C_Type *IIC_BASE, uint32_t status);
/**********************************************************************
 * 函数名称： i2c_start
 * 功能描述： 发送开始信号
 * 输入参数： 1.I2C的基地址2.设备地址3.操作码
 * 返 回 值： 返回0成功，返回<0失败
 ***********************************************************************/
int8_t i2c_start(I2C_Type *IIC_BASE, uint8_t ucSlaveAddr, uint32_t ulOpcode);
/**********************************************************************
 * 函数名称： i2c_stop
 * 功能描述： 停止信号
 * 输入参数： 1.I2C的基地址  
 * 返 回 值： 返回0成功，返回<0失败
 ***********************************************************************/

int8_t i2c_stop(I2C_Type *IIC_BASE);
/**********************************************************************
 * 函数名称： i2c_restart
 * 功能描述： 发送重新开始信号
 * 输入参数： 1.I2C的基地址 2.传输结构体
 * 输出参数： 无
 * 返 回 值： 返回0成功，返回<0失败
 ***********************************************************************/
int8_t i2c_restart(I2C_Type *IIC_BASE, uint8_t ucSlaveAddr, uint32_t ulOpcode);
/**********************************************************************
 * 函数名称： i2c_write
 * 功能描述： i2c master 写操作
 * 输入参数： 1.I2C的基地址 2.数据 3.数据长度
 * 返 回 值： 无
 ***********************************************************************/
void i2c_write(I2C_Type *IIC_BASE, const uint8_t *pbuf, uint32_t len);
/**********************************************************************
 * 函数名称： i2c_read
 * 功能描述： i2c_master 读操作
 * 输入参数： 1.I2C的基地址 2.数据 3.数据长度
 * 返 回 值： 无
 ***********************************************************************/
void i2c_read(I2C_Type *IIC_BASE, uint8_t *pbuf, uint32_t len);
/**********************************************************************
 * 函数名称： i2c_transfer
 * 功能描述： i2c传输，包括读写功能
 * 输入参数： 1.I2C的基地址 2.传输结构体
 * 返 回 值： 返回传输成功，返回<0传输出错
 ***********************************************************************/
int16_t i2c_transfer(I2C_Type *IIC_BASE, I2C_TRANSFER *transfer);

/**********************************************************************
 * 函数名称： I2C_WriteOneByte
 * 功能描述： 向IC从设备的reg地址写入1个字节数据data
 * 输入参数： 1.设备地址 2.要写入寄存器 3.要写入数据
 * 返 回 值： 返回0写成功，返回<0写失败
 ***********************************************************************/

int16_t i2c_write_one_byte(uint8_t addr,uint8_t reg, uint8_t data, I2C_Type *IIC_BASE);

/**********************************************************************
 * 函数名称： I2C_ReadOneByte
 * 功能描述： 向IC从设备的reg地址读1个字节数据
 * 输入参数： 1.设备地址 2.要读的寄存器
 * 返 回 值： 读到的寄存器的值
 ***********************************************************************/

uint8_t i2c_read_one_byte(uint8_t addr, uint8_t reg, I2C_Type *IIC_BASE);
#endif
